#include "Matrix.h"


namespace Math{

    Matrix::Matrix(){
        for (int i=0;i<16;++i){
            m_Data[i] = 0.0f;
        }
		m_Data[0] = m_Data[5] = m_Data[10] = m_Data[15] = 1.0f;
    }

	float& Matrix::operator()(size_t row, size_t col){
		return m_Data[row*4+col];
	}

	float Matrix::operator()(size_t row, size_t col) const{
		return m_Data[row*4+col];
	}

    Matrix Matrix::operator*(const Matrix &rhs){
        Matrix nMat;//zero matrix
        // Je sais pas si c'est la manière la plus efficace
        // mais c'est celle que je vois le plus souvent.
        // y'a quand même probablement moyen d'écrire plus intense
        // en assembleur.
        for(int i=0;i<16;i+=4){
            for (int j=0;j<4;++j){
                for (int k=0;k<4;++k){
                    nMat.m_Data[i+j]+=m_Data[j+k*4]*rhs.m_Data[i+k];
                }}}
        return nMat;
    }

    bool Matrix::operator==(Matrix const& rhs){
        for (int i=0;i<16;++i){
            if (rhs.m_Data[i]!=m_Data[i]){
                return false;
            }
        }
        return true;
    }

    Matrix Matrix::operator*(const float &rhs){
        Matrix newMat;
        for (int i=0;i<16;++i){
            newMat.m_Data[i] = rhs*m_Data[i];
        }
        return newMat;
    }

    Matrix Matrix::operator+(const float &rhs){
        Matrix newMat;
        for (int i=0;i<16;++i){
            newMat.m_Data[i] = rhs+m_Data[i];
        }
        return newMat;
    }

	void Matrix::identity()
	{
		for (int i = 0; i < 16; i++)
			m_Data[i] = 0.0f;

		m_Data[0] = m_Data[5] = m_Data[10] = m_Data[15] = 1.0f;
	}
}
